package com.pethospital.dao;

import com.pethospital.entity.PageResult;
import com.pethospital.entity.Pet;

import java.util.List;

/**
 * 宠物数据访问接口
 * Pet Data Access Object Interface
 * 
 * @author PetHospital System
 * @version 1.0
 */
public interface PetDao {
    
    /**
     * 根据宠物ID查询宠物
     * 
     * @param petId 宠物ID
     * @return Pet 宠物对象，如果不存在返回null
     */
    Pet findById(Integer petId);
    
    /**
     * 根据主人ID查询宠物列表
     *
     * @param ownerId 主人ID
     * @return List<Pet> 宠物列表
     */
    List<Pet> findByOwnerId(Integer ownerId);

    /**
     * 根据主人ID查询最近添加的宠物
     *
     * @param ownerId 主人ID
     * @param limit 限制数量
     * @return List<Pet> 最近添加的宠物列表
     */
    List<Pet> findRecentByOwnerId(Integer ownerId, int limit);
    
    /**
     * 添加宠物
     * 
     * @param pet 宠物对象
     * @return int 影响的行数
     */
    int insert(Pet pet);
    
    /**
     * 更新宠物信息
     * 
     * @param pet 宠物对象
     * @return int 影响的行数
     */
    int update(Pet pet);
    
    /**
     * 删除宠物
     * 
     * @param petId 宠物ID
     * @return int 影响的行数
     */
    int delete(Integer petId);
    
    /**
     * 批量删除宠物
     * 
     * @param petIds 宠物ID数组
     * @return int 影响的行数
     */
    int batchDelete(Integer[] petIds);
    
    /**
     * 查询所有宠物
     * 
     * @return List<Pet> 宠物列表
     */
    List<Pet> findAll();
    
    /**
     * 分页查询宠物
     * 
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> findByPage(int currentPage, int pageSize);
    
    /**
     * 根据主人ID分页查询宠物
     * 
     * @param ownerId 主人ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> findByOwnerIdAndPage(Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 根据条件分页查询宠物
     * 
     * @param petName 宠物姓名（模糊查询）
     * @param petType 宠物类型
     * @param breed 品种
     * @param status 健康状态
     * @param ownerId 主人ID（可选，为null时查询所有）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> findByCondition(String petName, String petType, String breed,
                                  String status, Integer ownerId, int currentPage, int pageSize);

    /**
     * 根据条件分页查询宠物（带排序）
     *
     * @param petName 宠物名称（模糊查询）
     * @param petType 宠物类型
     * @param breed 品种
     * @param status 健康状态
     * @param ownerId 主人ID（为null时查询所有）
     * @param sortField 排序字段
     * @param sortOrder 排序方向（asc/desc）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Pet> 分页结果
     */
    PageResult<Pet> findByConditionWithSort(String petName, String petType, String breed,
                                          String status, Integer ownerId, String sortField,
                                          String sortOrder, int currentPage, int pageSize);

    /**
     * 统计宠物总数
     *
     * @return long 宠物总数
     */
    long countAll();
    
    /**
     * 根据主人ID统计宠物数量
     * 
     * @param ownerId 主人ID
     * @return long 宠物数量
     */
    long countByOwnerId(Integer ownerId);
    
    /**
     * 根据宠物类型统计数量
     * 
     * @param petType 宠物类型
     * @return long 宠物数量
     */
    long countByPetType(String petType);
    
    /**
     * 根据健康状态统计数量
     *
     * @param status 健康状态
     * @return long 宠物数量
     */
    long countByStatus(String status);

    /**
     * 统计今日注册宠物数量
     *
     * @return long 今日注册宠物数量
     */
    long countTodayRegistered();

    /**
     * 根据主人ID统计今日注册宠物数量
     *
     * @param ownerId 主人ID
     * @return long 今日注册宠物数量
     */
    long countTodayRegisteredByOwnerId(Integer ownerId);
    
    /**
     * 更新宠物状态
     * 
     * @param petId 宠物ID
     * @param status 健康状态
     * @return int 影响的行数
     */
    int updateStatus(Integer petId, String status);
    
    /**
     * 更新宠物照片
     * 
     * @param petId 宠物ID
     * @param photoUrl 照片路径
     * @return int 影响的行数
     */
    int updatePhoto(Integer petId, String photoUrl);
    
    /**
     * 获取宠物类型统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[类型, 数量]
     */
    List<Object[]> getPetTypeStatistics();
    
    /**
     * 获取健康状态统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[状态, 数量]
     */
    List<Object[]> getStatusStatistics();
}
